package com.gitee.ywj1352.netty.server.handler;

import com.gitee.ywj1352.common.SerializationUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

/**
 * @author wenjie.yang on 2019/10/23.
 */
public class RpcDecoder<T> extends ByteToMessageDecoder {


    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        //这里为什么是 4呢
        //应该 在new LengthFieldBasedFrameDecoder(65536, 0, 4, 0, 0)
        //这里 我们定义了 包的 前四个字节 表示为 byte 的长度
        if (in.readableBytes() < 4) {
            return;
        }
        in.markReaderIndex();
        //读取包的长度 并且offset 往后移动四位
        int dataLength = in.readInt();
        //半包 当前的 数据没有达到 数据包 的length
        if (in.readableBytes() < dataLength) {
            //保存当前读到的数据，下一次继续读取
            in.resetReaderIndex();
            return;
        }
        //没有发生半包
        byte[] data = new byte[dataLength];
        in.readBytes(data);

        Object obj = SerializationUtil.deserialize(data, getGenerics());
        //返回转换的值
        //Object obj = JsonUtil.deserialize(data,genericClass); // Not use this, have some bugs
        out.add(obj);
    }

    @SuppressWarnings("all")
    private Class getGenerics() {
        Class clazz = this.getClass();
        //getSuperclass()获得该类的父类
        System.out.println(clazz.getSuperclass());
        //getGenericSuperclass()获得带有泛型的父类
        //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
        Type type = clazz.getGenericSuperclass();
        System.out.println(type);
        //ParameterizedType参数化类型，即泛型
        ParameterizedType p = (ParameterizedType) type;
        //getActualTypeArguments获取参数化类型的数组，泛型可能有多个
        Class c = (Class) p.getActualTypeArguments()[0];
        return c;
    }

}
